% GRUPO 6
% =======
% Fecha: Marzo de 2011
%
% Liendro, José Indalecio 	48240
% Modernel, Damian		45002		
% Prieto, Cristian		47573


% REDES NEURONALES: Aprendizaje Supervisado

% Simmetry
% ======== 
% Parmeters
% ---------
% n		: How many neurons are in the input layer			
% neurons	: Neurons by layer, hidden layers and output layer included e. 	[3,2,1]
% filename	: File plot output name. Name must end with 			".jpg"


function tpe1(n,neurons,filename)

	if(columns(neurons) < 1 || n < 1)
		error("neurons or n must have at least one element");
	endif

	%Constantes simbólicas
	LINEAR	= 1;
	TANH 	= 2;
	EXP	= 3;
	
	ETA	= 0.1;		% coeficiente de aprendizaje
	METHOD	= TANH;		
	CURRENT	= METHOD;
	BETA	= 0.7;		% constante de la funcion de transicion
	LIM	= 2.5;
	LINF	= -LIM;
	LSUP	= LIM;
	LAYERS	= columns(neurons);
	DP	= "x-uniform";	% Distribution Pattern

	STEPS	= 5;
	ALPHA	= 0;		%Al setear ALPHA en 0 la mejora del momentum no afecta
	A 	= ETA/2;
	B 	= ETA/2;
	mseAnt 	= 100 %Para asegurarme que la primera vez lo tome como que disminuyó el error

	aprendidos = 0;
	generalizados = [];

	W	= randomWeights(n,neurons,LINF,LSUP);	% vector de matrices

	% Condiciones iniciales
	% table	= makePatterns(n); %simmetry
	% QTY=2^n;

	QTY		= 90;
	ERROR_PATT	= 0.1
	DELTA		= 0.5 *(QTY * ERROR_PATT^2)+ERROR_PATT 	% error limite - DEPENDE DE LA CANT DE INPUTS !!!
	[table,test] 	= makestartset(QTY,DP,false);
	era		= 0;

	j 		= 0;
	eta 		= ETA;
	alpha 		= ALPHA;

	%inicializo los deltaWAnt
	for k=1:LAYERS
	    deltaWAnt{k} = 0;
	endfor

	do
		aprendidos = 0;;
		S	= table(:,columns(table));
		patterns= table;
		patterns(:,columns(patterns))=-ones(QTY,1);			% valores de los umbrales

		for p=1:rows(patterns)

			k = 1;
			for l=1: LAYERS
				if(l > 1)
					WS{l}=W{l}*V{l-1};
				else						% WS: weighted sum (suma pesada)
					WS{l}=W{l}*patterns(p,:)';		% p TRANSPUESTA
				endif
				if( l == LAYERS)
					METHOD=LINEAR;	
				endif
				
				V{l}	=g(METHOD,WS{l},BETA);
				V{l}(rows(V{l})+1) = -1;			% peso del UMBRAL
			endfor

			


			O(p)	= V{LAYERS}(1);
			d	= gDer(METHOD,WS{LAYERS},BETA);
			d	= d * (S(p) - O(p));
			deltaW = eta * d * V{LAYERS-1}' + deltaWAnt{k} * alpha;
			W{LAYERS} = W{LAYERS} + deltaW;		% V TRANSPUESTA

			deltaWAnt{k} = deltaW;
			k = k + 1;

			if( abs(S(p) - O(p)) < DELTA )
				aprendidos++;
			endif				

			METHOD=CURRENT;
			for l=LAYERS-1:-1:1 					
				WU=d*W{l+1};					
				WU=WU(:,1:columns(WU)-1);			% WU=los pesos de la capa de arriba sin los pesos del umbral
				d=gDer(METHOD,WS{l},BETA)'.* WU;	    	 

				if(l > 1)
					deltaW = eta * d' * V{l-1}' + deltaWAnt{k} * alpha;
				else
					deltaW = eta * d' * patterns(p,:) + deltaWAnt{k} * alpha;
				endif

				W{l}=W{l} + deltaW;
				deltaWAnt{k} = deltaW ;
				k = k + 1;
			endfor

		endfor

		mse	= middlesquareerror(S, O);
		table	= mixPatterns(table);
		era	= era+1;
		printf("Era: %d\t\t mse: %f\n",era,mse);

	until (mse < DELTA || era == 1000)
	printf("aprendidos: %d", aprendidos);

%******************************************************************************************************%
%***********************************Generación de testeos y gráficos***********************************%

	ST= test(:,2)';
	test(:,columns(test))=-ones(QTY,1);			% valores de los umbrales

	for t=1:rows(test)

		for l=1: LAYERS
			if(l > 1)
				WS{l}=W{l}*V{l-1};
			else
				WS{l}=W{l}*test(t,:)';		% p TRANSPUESTA
			endif

			if( l == LAYERS)
				METHOD=1;	
			endif
		
			V{l}	=g(METHOD,WS{l},BETA);
			V{l}(rows(V{l})+1) = -1;		% peso del UMBRAL

		endfor
		METHOD=2;

		OT(t)= V{LAYERS}(1);
	endfor

	LC= ST-OT;

	for i=1:columns(LC)
		if(LC(i)<=ERROR_PATT)
			LC(i)=1;
		else
			LC(i)=0;
		endif
	endfor	

	lc=sum(LC)/QTY*100;

	% plotanswer(patterns, S,O,test,)
	plot(patterns(:,1),zeros(rows(patterns)),"-",patterns(:,1),S,"*b;PATRONES;",patterns(:,1)',O,"+r;APROXIMACION;",test(:,1),OT,"xg;TEST;");
	title("APREHENDIZAJE SUPERVISADO\n f(x) = sinh(x)cos(x^2) [Funcion 12]");

	% NO BORRAR LOS ESPACIOS EN BLANCO EN LOS SPRINTF !
	description=sprintf("Patrones:      %d\nDistribucion: %s\nEpocas:         %d\nECM:             %f",QTY,DP,era,mse);
	configuration=sprintf("Beta: %f\nEta:   %f",BETA,ETA);
	improve=sprintf("Alfa: %f\nA:     %f\nB:     %f",ALPHA,A,B);
	learning=sprintf("Tasa de Aprendizaje: %.2f",lc);

	layers=sprintf("Capas: %d\n",columns(neurons));
	for l=LAYERS:-1:1
		layers=sprintf("%s\nn%d:       %d",layers,l,neurons(l));
	endfor

	text(-1, 2.5, learning);
	text(1,2, layers);
%	Así se pueden mostrar carteles con leyendas en las coordenadas del plot
%	text(-1.5,2, "<- Problemas de generalizacion");
	GLINE = -1.8;
	text(-1.5,GLINE, description);
	text(-0.3,GLINE, configuration);
	text(0.5,GLINE, improve);


	xlabel("x");
	ylabel("f(x)");

	filename = sprintf("%s%s","../plots/",filename);
	print (filename,"-djpg");

endfunction


